// 更新头像
const multer = require('multer')
const path = require('path')
const fs = require('fs').promises
const { existsSync, mkdirSync } = require('fs')

const db = require('../db/index.js')

// 确保上传目录存在
const AVATAR_UPLOAD_DIR = path.join(__dirname, '../data/avatar')
if (!existsSync(AVATAR_UPLOAD_DIR)) {
    mkdirSync(AVATAR_UPLOAD_DIR, { recursive: true })
}

// 配置Multer存储
const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, AVATAR_UPLOAD_DIR)
    },
    filename: async (req, file, cb) => {
        try {
            // 获取用户ID（假设从认证中间件获取）
            const userId = req.user.uid
            // 获取文件扩展名
            const ext = path.extname(file.originalname).toLowerCase()
            // 生成唯一文件名：用户ID + 时间戳 + 扩展名
            const fileName = `${userId}-${Date.now()}${ext}`
            cb(null, fileName)
        } catch (error) {
            cb(error)
        }
    }
})

// 文件过滤：只允许图片类型
const fileFilter = (req, file, cb) => {
    // 允许的MIME类型
    const allowedMimeTypes = [
        'image/jpeg',
        'image/png',
        'image/gif',
        'image/webp'
    ]

    // 允许的文件扩展名
    const allowedExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.webp']
    const ext = path.extname(file.originalname).toLowerCase()


    if (allowedMimeTypes.includes(file.mimetype) && allowedExtensions.includes(ext)) {
        cb(null, true) // 接受文件
    } else {
        cb(new Error('只允许上传JPG、PNG、GIF和WebP格式的图片'), false) // 拒绝文件
    }
}

// 配置Multer
const uploadMulter = multer({
    storage: storage,
    limits: {
        fileSize: 5 * 1024 * 1024, // 限制文件大小为5MB
    },
    fileFilter: fileFilter
})

// 更新头像
const updateAvatar = async (req, res) => {
    try {
        if (!req.file) {
            return res.cc('上传文件失败', 50)
        }

        // 构建头像的访问路径
        const newAvatarPath = `/avatar/${req.file.filename}`

        // 处理用户数据库中的头像
        let sqlStr = 'select uid,username,avatar_path,status from users where uid=?'
        let [results] = await db.query(sqlStr, [req.user.uid])
        if (results.length <= 0 || !results[0].status) {
            return res.cc('用户不存在', 40)
        }
        if (results.length !== 1) {
            return res.cc('用户数据读取失败', 30)
        }
        // 如果有, 删除旧头像
        const oldAvatarPath = results[0].avatar_path
        if (oldAvatarPath) {
            await fs.unlink(path.join(__dirname, '../data' + oldAvatarPath))
        }
        // 数据库更新新头像路径
        sqlStr = 'update users set avatar_path=? where uid=?'
            ;[results] = await db.query(sqlStr, [newAvatarPath, req.user.uid])
        if (results.affectedRows !== 1) {
            return res.cc('更新失败', 30)
        }
        return res.send({
            code: 0,
            msg: '更新用户头像成功',
            data: {
                uid: req.user.uid,
                username: req.user.username,
                avatar_path: newAvatarPath
            }
        })
    } catch (err) {
        console.log('Error: updateAvatar-> ', err.message)
        // 根据错误类型返回不同的状态码和信息
        if (err.message.includes('只允许上传')) {
            return res.cc('只允许上传JPG、PNG、GIF和WebP格式的图片', 1)
        }
        if (db.isDatabaseError(err)) {
            return res.cc(err, 30)
        } else {
            throw err
        }
    }
}


module.exports = {
    uploadMulter,
    updateAvatar
}